#include "../ui/ui.h"
#include "carro.h"
#include "../bd/bd.h"
#include <stdio.h>
#include <stdlib.h>
#include "../util/util.h"

res_busq_p * inicarro = NULL, *fincarro=NULL;
WINDOW *ventana1,*Wbody;
void act_listacarro(WINDOW * Wlista,char * formato, res_busq_p * prods,int inicial,int max);
void escribirStats(res_busq_p * nodo);

menu SubMenuCarro[] =
{
    {"Ver el Carro", ver_carro, "Muestra todos los productos que se estan comprando",1 },
    {"Agregar al Carro",agre_carro,"Agrega porductos al carro",1},
    {"Quitar del Carro",qui_carro,"Quita porductos al carro",1},
    {"Vender",vender_carro,"Vende el carro ingresado",1},
    {"Vaciar Carro",borrar_carro,"Borra el listado de compra",1},
    { "", 0, "",3 }
};


void menuCarro(void)
{
    mostrar_menu(SubMenuCarro);
}

void ver_carro()
{
    if (inicarro==NULL)
    preg_error("Agregue productos al carro primero !!",1);
    else
    mostrar_listacarro(inicarro,0,2,act_listacarro);


}


void vender_carro()
{
    if (inicarro==NULL)
        preg_error("Agregue productos al carro primero !!",1);
    else
        mostrar_listacarro(inicarro,3,3,act_listacarro);
}

void qui_carro()
{
    if (inicarro==NULL)
    preg_error("El carro esta vacio !!", 1);
    else
    mostrar_listacarro(inicarro,2,2,act_listacarro);

}
void borrar_carro()
{
    borrar_todo(inicarro);
}

void borrar_todo(res_busq_p* todo)
{
    res_busq_p *aux=(res_busq_p*)malloc(sizeof(res_busq_p));
     if (todo==NULL)
        preg_error("El carro esta vacio !!", 1);
    else
        {
            while (todo->sig!=NULL)
           {
               aux=todo->sig;
               todo->sig=NULL;
               todo->ant=NULL;
               todo->prod=NULL;
               todo=NULL;
               todo=aux;

           }
           todo->ant=NULL;
           todo=NULL;
           aux= NULL;
           inicarro=todo;
           fincarro=inicarro;
            preg_error("El carro se borro por completo", 0);

        }
}



void agre_carro()
{
    char **resp= NULL;
    res_busq_p * primero;
    nodo_producto * filtro=(nodo_producto*)malloc(sizeof(nodo_producto));
    char *mensaje= "ingrese datos producto a buscar";
    char *campos[] =
    {
        "Nombre", "Descipcion","Codigo","Precio",NULL
    };
    if ((resp=obtener_datos(campos,mensaje,45,0)))
    {
        filtro->nombre=resp[0];
        filtro->descripcion= resp[1];
        filtro->codigo = resp[2];
        filtro->precio = atoi(resp[3]);
        filtro->stock=atoi(resp[4]);
        primero = buscarProd(filtro,0);
        mostrar_listacarro(primero,1,1,actListaP);
        liberar_char_array(resp);
    }
}

void borrarprocarro(res_busq_p * pro, int cantidad)
{
       if (pro->cant==cantidad)
            {
                     pro->cant=0;
                    if(pro->ant) //si no es el primer elemento
                        (pro->ant)->sig=pro->sig;
                    else inicarro=pro->sig;
                    if(pro->sig) //si no es el ultimo
                        (pro->sig)->ant=pro->ant;
                    else fincarro->ant=pro->ant;
            }
        else
            pro->cant-=cantidad;
}

void agregarcarro(nodo_producto * pro, int cantidad)
{
    res_busq_p *temp=(res_busq_p*)malloc(sizeof(res_busq_p));
    temp->prod=pro;
    temp->cant=cantidad;
    if (inicarro==NULL)
    {
        inicarro=temp;
        inicarro->ant=NULL;
        inicarro->sig=NULL;
        fincarro=inicarro;
    }
    else
 {
       res_busq_p *usado=inicarro;
       while (usado)
       {

        if (usado->prod->codigo==temp->prod->codigo)
           {
               preg_error("El producto ya esta en la lista del carro, modifique la cantidad !!",1);
               char *campos[] =
               {
                    "CANTIDAD NUEVA",NULL
               };
               char **resp= NULL;
               usado->cant=999999999;
               while (usado->cant>usado->prod->stock)
               {
                    if ((resp=(obtener_datos(campos,"cuantos productos de estos mismo quiere", 3,0))))
                                    {
                                      usado->cant = atoi(resp[0]);
                                    }
                    if(usado->cant>usado->prod->stock)
                                    preg_error("No se pudo agregar tal cantidad de productos !!",1);

               }
               preg_error("Se cambio la cantidad del producto !!",1);
               break;
            }

        usado=usado->sig;
       }
    if (usado==NULL)
            {
                fincarro->sig=temp;
                temp->ant=fincarro;
                temp->sig=NULL;
                fincarro=temp;
            }
    //liberarResBusqP(usado);
    }

}



void mostrar_listacarro(res_busq_p * productos, int a, int b,void (*funcion)(WINDOW * Wlista,char * formato, res_busq_p * prods,int inicial,int max))
{
    int comparacion;
    char **resp= NULL;
    char *campos[] =
    {
        "CANTIDAD",NULL
    };
    int tecla,pos_ant = -1, pos_ac= 0,nitems,maxy=LINES-4;
    int item_actual=1,item_antiguo=1;
    bool stop = FALSE;
    WINDOW *Wlista1;
    WINDOW * Wbody=obt_win_cuerpo();
    char fmt1[60],fmt2[60];
    sprintf(fmt1," %%-4i %c %%-52.52s %c %%-52.52s %c %%-12.12s %c $%%-7.7i %c %%-4.4i",179,179,179,179,179);
    sprintf(fmt2," %%-4i %c %%-52.52s %c %%-52.52s %c %%-12.12s %c $%%-7.4i %c %%-4.i",179,179,179,179,179);

    //init_pair(11,)
    res_busq_p *anterior=NULL,*temp=productos;

    curs_set(0);
    //obt_pos_menu(&y, &x);
    for(nitems=0; temp; temp=temp->sig,nitems++);
    temp=productos;
    if(!(Wlista1=subwin(Wbody,maxy, COLS, 3, 0)))
    {
        msg_estado("ERROR!!!!");

    }
    caja_color(Wlista1, COLOR_CUERPO, 0);
    (*funcion)(Wlista1,fmt1, productos,1,maxy);
    keypad(Wlista1,1);
    scrollok(Wlista1,1);
    switch (b)
    {
        case 1:
            {
               mvwprintw(Wbody,0,0," %-4.4s %c %-52.52s %c %-52.52s %c %-12.12s %c %-7.7s  %c %-5.5s","Num",179,"Nombre producto",179,
              "Descripcion",179,"Codigo",179,"Precio",179,"Stock");
                wrefresh(Wbody);
                break;
            }
        case 2:
        case 3:
            {
                (*funcion)(Wlista1,fmt2, productos,1,maxy);

                 mvwprintw(Wbody,0,0," %-4.4s %c %-52.52s %c %-52.52s %c %-12.12s %c %-7.7s  %c %-5.5s","Num",179,"Nombre producto",179,
                "Descripcion",179,"Codigo",179,"Precio",179,"Cant");
                wrefresh(Wbody);
                break;
            }
       default:
        break;
    }
    while (!stop)
    {
        switch (b)
        {
            case 1:
                  {
                           if (pos_ac != pos_ant)
                            {
                                if (pos_ant != -1)
                                print_product(Wlista1,pos_ant,fmt1,item_antiguo,anterior->prod);
                                setear_color(Wlista1,COLOR_MENU_PRINCIPAL_SEL);
                                print_product(Wlista1,pos_ac,fmt1,item_actual,temp->prod);
                                setear_color(Wlista1, COLOR_CUERPO);
                                pos_ant = pos_ac;
                                wrefresh(Wlista1);
                            }
                            break;
                  }
            case 2:
                  {

                        if (pos_ac != pos_ant)
                            {
                                if (pos_ant != -1)
                                print_productcarro(Wlista1,pos_ant,fmt2,item_antiguo,anterior);
                                setear_color(Wlista1,COLOR_MENU_PRINCIPAL_SEL);
                                print_productcarro(Wlista1,pos_ac,fmt2,item_actual,temp);
                                setear_color(Wlista1, COLOR_CUERPO);
                                pos_ant = pos_ac;
                                wrefresh(Wlista1);
                            }
                            break;
                    }
            case 3:
                    {
                         if (pos_ac != pos_ant)
                            {
                                if (pos_ant != -1)
                                print_productcarro(Wlista1,pos_ant,fmt2,item_antiguo,anterior);
                                setear_color(Wlista1,COLOR_MENU_PRINCIPAL_SEL);
                                print_productcarro(Wlista1,pos_ac,fmt2,item_actual,temp);
                                setear_color(Wlista1, COLOR_CUERPO);
                                pos_ant = pos_ac;
                                res_busq_p *recorrer=(res_busq_p*)malloc(sizeof(res_busq_p));
                                int suma=0;
                                recorrer=inicarro;
                                    while(recorrer)
                                    {
                                       suma = suma + ((recorrer->cant)*(recorrer->prod->precio));
                                       recorrer=recorrer->sig;
                                    }

                                ventana1=subwin(Wbody,1,COLS,LINES-2,0);
                                caja_color(ventana1,COLOR_SUB_MENU,1);
                                wprintw(ventana1,"%s""%i","                                         Valor total de la compra  $", suma);
                                wrefresh(ventana1);
                                wrefresh(Wlista1);
                                liberarResBusqP(recorrer);
                            }
                            break;

                    }
            default:
            break;
        }
        if (a==3)
        {
            if(preg_error("Desea Vender el carro?\n   S/N",0)==('S'|'s'))
            {
                res_busq_p *vender=inicarro;
                while (vender!=NULL)
                {
                    (vender->prod->stock)-=vender->cant;
                    vender=vender->sig;
                }
                if (vender==NULL)
                escribirStats(inicarro);
                preg_error("El carro fue vendido, porfavor borrar el carro !!",1);
            }



        }
        switch (tecla = wgetch(Wlista1))
        {
        case '\n':
            touchwin(Wbody);
            wrefresh(Wbody);
            curs_set(1);
            switch (a)
            {
                case 1:
                {

                    if(preg_error("Desea Agregar el producto al carro?\n   S/N",0)==('S'|'s'))
                        {
                                temp->cant=0;
                                do{
                                    if(temp->cant!=0)
                                        preg_error("No se pudo agregar tal cantidad de productos !!",1);
                                    resp=(obtener_datos(campos,"cuantos productos de estos mismo quiere", 5,0));
                                }while(resp&&resp[0]!='\0'&&(temp->cant=atoi(resp[0]))>temp->prod->stock);
                                if(resp&&temp->cant>0)
                                    agregarcarro(temp->prod, temp->cant);
                        }
                    break;
                }//  mostrar_menu(prods); //esta es la funcion que se ejecuta al presionar enter(se puede cambiar),
//                                  y el producto seleccionado es temp->prod, la unica razon
//                                    pa modificar algo mas alla de item->prod-> es actualizar el stock
                case 2:
                {

                       if(preg_error("Desea Borrar el producto del carro?\n   S/N",0)==('S'|'s'))
                        {
                            comparacion=999999999;
                            while (comparacion>temp->cant)
                            {
                                if ((resp=(obtener_datos(campos,"Cuantos va a eliminar? ", 3,0))))
                                    {
                                        comparacion = atoi(resp[0]);
                                    }
                                   if(comparacion>temp->cant)
                                  preg_error("No se pudo Borrar tal cantidad de productos !!",1);
                            }
                             if ((temp->cant)>=(comparacion))
                            borrarprocarro(temp, comparacion);
                        }
                          break;
                   }
                  default:
                {
                    break;
                }
            }
            curs_set(0);
            pos_ant = -1;
            break;
        case KEY_UP:
            if(temp->ant)
            {
                if(pos_ac==0)
                {
                    int i;
                    anterior=temp->ant;
                    for(i=0; (temp->ant)&&(i<maxy); temp=temp->ant,i++); //vuelve (maxy) items atras!!
                    (*funcion)(Wlista1,fmt1,temp,item_actual-maxy,maxy);
                    temp=anterior;
                    pos_ac=maxy-1;
                    pos_ant=-1;//pa que no desactive el anterior, por que no hay anterior
                }
                else
                {
                    anterior=temp;
                    temp=temp->ant;
                    pos_ac = (pos_ac - 1) % maxy;
                }
                item_antiguo=item_actual;
                item_actual--;
            }
            break;
        case KEY_DOWN:
            if(temp->sig)
            {
                item_antiguo=item_actual;
                item_actual++;
                if(pos_ac==(maxy-1))
                {
                    (*funcion)(Wlista1,fmt1,temp->sig,item_actual,maxy);
                    pos_ant=-1;
                }

                anterior=temp;
                temp=temp->sig;
                pos_ac = (pos_ac + 1) % maxy;

            }
            break;
        case KEY_ESC:
            stop = TRUE;
            break;
        }
    }

    werase(Wlista1);
    delwin(Wlista1);
    werase(Wbody);
    touchwin(Wbody);
    wrefresh(Wbody);
    }

void print_productcarro(WINDOW * win,int y,char *formato,int item,res_busq_p * recibe)
{
    mvwprintw(win,y,0,formato,item,recibe->prod->nombre,recibe->prod->descripcion,recibe->prod->codigo,recibe->prod->precio,recibe->cant);
}

void act_listacarro(WINDOW * Wlista,char * formato, res_busq_p * prods,int inicial,int max)
{
    int i=0;
    res_busq_p *p = prods;
    werase(Wlista);
    do
    {
        print_productcarro(Wlista,i,formato,i+inicial,p);
        i++;
    }
    while((p=p->sig)&&(i<max));
    touchwin(Wlista);
    wrefresh(Wlista);
}


void actListaP(WINDOW * Wlista,char * formato, res_busq_p * prods,int inicial,int max)
{
    int i=0;
    res_busq_p *p = prods;
    nodo_producto *producto=NULL;
    werase(Wlista);
    do
    {
        producto=p->prod;
        print_product(Wlista,i,formato,i+inicial,producto);
        i++;
    }
    while((p=p->sig)&&(i<max));
    touchwin(Wlista);
    wrefresh(Wlista);
}

void print_product(WINDOW * win,int y,char *formato,int item,nodo_producto * producto)
{
    mvwprintw(win,y,0,formato,item,producto->nombre,producto->descripcion,producto->codigo,producto->precio,producto->stock);
}

void escribirStats(res_busq_p * nodo)
{
    int suma=0;
    FECHA * fecha=obtenerFecha();
    do{
        nodo->prod->total+=nodo->cant;
        suma+=nodo->cant * nodo->prod->precio;
        if(nodo->prod->mes_act.t!=fecha->mes)
        {
            nodo->prod->mes_ant2=nodo->prod->mes_ant;
            nodo->prod->mes_ant=nodo->prod->mes_act;
            nodo->prod->mes_act.t=fecha->mes;
            nodo->prod->mes_act.dato=nodo->cant;
            nodo->prod->semana.t=fecha->semana;
            nodo->prod->semana.dato=nodo->cant;
            nodo->prod->dia.t=fecha->dia;
            nodo->prod->dia.dato=nodo->cant;
        }else
        {
            nodo->prod->mes_act.dato+=nodo->cant;
            if(nodo->prod->semana.t!=fecha->semana)
            {
                nodo->prod->semana.t=fecha->semana;
                nodo->prod->semana.dato=nodo->cant;
                nodo->prod->dia.t=fecha->dia;
                nodo->prod->dia.dato=nodo->cant;
            }else{
                nodo->prod->semana.dato+=nodo->cant;
                if(nodo->prod->dia.t!=fecha->dia)
                {
                    nodo->prod->dia.t=fecha->dia;
                    nodo->prod->dia.dato=nodo->cant;
                }else nodo->prod->dia.dato+=nodo->cant;
            }
        }
    }while(nodo&&(nodo=nodo->sig)!=NULL);
    vendActual->total+=suma;
    if(vendActual->mes_act.t!=fecha->mes)
    {
        vendActual->mes_ant2=vendActual->mes_ant;
        vendActual->mes_ant=vendActual->mes_act;
        vendActual->mes_act.t=fecha->mes;
        vendActual->mes_act.dato=suma;
        vendActual->dia.t=fecha->dia;
        vendActual->dia.dato=suma;
        vendActual->semana.t=fecha->semana;
        vendActual->semana.dato=suma;
    }else{
        vendActual->mes_act.dato+=suma;
        if(vendActual->semana.t!=fecha->semana)
        {
            vendActual->semana.t=fecha->semana;
            vendActual->semana.dato=suma;
            vendActual->dia.t=fecha->dia;
            vendActual->dia.dato=suma;
        }else
        {
            vendActual->semana.dato+=suma;
            if(vendActual->dia.t!=fecha->dia)
            {
                vendActual->dia.t=fecha->dia;
                vendActual->dia.dato=suma;
            }else vendActual->dia.dato+=suma;
        }
    }
}
